// 用户凭证相关API
import { AuthenticatedRequest } from './authenticatedRequest';
import type { ApiResponse } from '../utils/axiosInstance';
import { LocationService } from './location'; // 导入位置服务

// 用户凭证数据类型定义
export interface UserCredential {
  id: number | null;
  userId: number;
  platformName: string;
  platformUrl: string | null;
  accountUsername: string;
  encryptedPassword: string;
  createdAt: string;
  updatedAt: string;
}

// 添加用户凭证请求参数类型
export interface AddUserCredentialParams {
  userId: number;
  platformName: string;
  platformUrl?: string;
  accountUsername: string;
  encryptedPassword: string;
}

/**
 * 用户凭证API服务
 */
export class CredentialService {
  /**
   * 添加用户凭证
   * @param params 用户凭证参数
   * @returns Promise<ApiResponse<UserCredential>> 添加凭证响应
   */
  public static async addUserCredential(params: AddUserCredentialParams): Promise<ApiResponse<UserCredential>> {
    try {
      console.log(`准备添加用户凭证:`, params);
      
      // 验证必要参数
      if (!params.userId || typeof params.userId !== 'number') {
        throw new Error('无效的用户ID');
      }
      
      if (!params.platformName || typeof params.platformName !== 'string' || params.platformName.trim() === '') {
        throw new Error('平台名称不能为空');
      }
      
      if (!params.accountUsername || typeof params.accountUsername !== 'string' || params.accountUsername.trim() === '') {
        throw new Error('账号用户名不能为空');
      }
      
      if (!params.encryptedPassword || typeof params.encryptedPassword !== 'string') {
        throw new Error('密码不能为空');
      }
      
      // 发送请求到后端API
      const response = await AuthenticatedRequest.post<UserCredential>(
        '/userCredentials/addUserCredentials',  // 添加/api前缀
        params
      );
      
      console.log('添加用户凭证成功:', response);
      return response;
    } catch (error) {
      console.error('添加用户凭证失败:', error);
      // 重新抛出错误，让调用者处理
      throw error;
    }
  }
  
  /**
   * 获取用户的所有凭证信息
   * @param userId 用户ID
   * @returns Promise<ApiResponse<UserCredential[]>> 用户凭证列表响应
   */
  // 修改getUserCredentialsByUserId方法，确保先调用realtimeMsg接口
  public static async getUserCredentialsByUserId(userId: number): Promise<ApiResponse<UserCredential[]>> {
    try {
      console.log(`准备获取用户ID为${userId}的凭证信息`);
      
      // 验证用户ID
      if (!userId || typeof userId !== 'number') {
        throw new Error('无效的用户ID');
      }
      
      // 强制发送位置信息，确保后端有位置数据
      console.log('强制发送位置信息...');
      
      // 2. 尝试获取真实位置
      try {
        await LocationService.getCurrentLocationAndSend();
        console.log('真实位置信息发送成功');
      } catch (realLocationError) {
        console.warn('获取真实位置失败，但继续获取凭证:', realLocationError);
      }
      
      // 添加延迟，确保位置数据已保存到Redis
      await new Promise(resolve => setTimeout(resolve, 500));
      
      // 3. 最后才调用getUserCredentialsByUserId接口
      const response = await AuthenticatedRequest.get<UserCredential[]>(
        '/userCredentials/getUserCredentialsByUserId',  // 添加/api前缀
        { userId }
      );
      
      console.log(`获取用户ID为${userId}的凭证信息成功:`, response);
      return response;
    } catch (error) {
      console.error(`获取用户ID为${userId}的凭证信息失败:`, error);
      throw error;
    }
  }
}